// cp1252 to unicode conversion table
owl_wchar owl_cp1252_unicode_map[OWL_MAX_CP1252 + 1] =
{
  // ascii (0x00 - 0x7F)
  0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
  0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
  0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
  0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
  0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
  0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
  0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
  0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
  0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
  0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
  0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
  0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
  0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
  // outside ascii (0x80 - 0xFF)
  0x20AC,
  OWL_INV_CP1252, // 0x81	      	
  0x201A,
  0x0192,
  0x201E,
  0x2026,
  0x2020,
  0x2021,
  0x02C6,
  0x2030,
  0x0160,
  0x2039,
  0x0152,
  OWL_INV_CP1252,	// 0x8D      	
  0x017D,
  OWL_INV_CP1252,	// 0x8F      	
  OWL_INV_CP1252,	// 0x90     	
  0x2018,
  0x2019,
  0x201C,
  0x201D,
  0x2022,
  0x2013,
  0x2014,
  0x02DC,
  0x2122,
  0x0161,
  0x203A,
  0x0153,
  OWL_INV_CP1252,	// 0x9D   	
  0x017E,
  0x0178,
  0x00A0,
  0x00A1,
  0x00A2,
  0x00A3,
  0x00A4,
  0x00A5,
  0x00A6,
  0x00A7,
  0x00A8,
  0x00A9,
  0x00AA,
  0x00AB,
  0x00AC,
  0x00AD,
  0x00AE,
  0x00AF,
  0x00B0,
  0x00B1,
  0x00B2,
  0x00B3,
  0x00B4,
  0x00B5,
  0x00B6,
  0x00B7,
  0x00B8,
  0x00B9,
  0x00BA,
  0x00BB,
  0x00BC,
  0x00BD,
  0x00BE,
  0x00BF,
  0x00C0,
  0x00C1,
  0x00C2,	
  0x00C3,
  0x00C4,
  0x00C5,
  0x00C6,
  0x00C7,
  0x00C8,
  0x00C9,
  0x00CA,
  0x00CB,
  0x00CC,
  0x00CD,
  0x00CE,
  0x00CF,
  0x00D0,
  0x00D1,
  0x00D2,
  0x00D3,
  0x00D4,
  0x00D5,
  0x00D6,
  0x00D7,
  0x00D8,
  0x00D9,
  0x00DA,
  0x00DB,
  0x00DC,
  0x00DD,
  0x00DE,
  0x00DF,
  0x00E0,
  0x00E1,
  0x00E2,
  0x00E3,
  0x00E4,
  0x00E5,
  0x00E6,
  0x00E7,
  0x00E8,
  0x00E9,
  0x00EA,
  0x00EB,
  0x00EC,
  0x00ED,
  0x00EE,
  0x00EF,
  0x00F0,
  0x00F1,
  0x00F2,
  0x00F3,
  0x00F4,
  0x00F5,
  0x00F6,
  0x00F7,
  0x00F8,
  0x00F9,
  0x00FA,
  0x00FB,
  0x00FC,
  0x00FD,
  0x00FE,
  0x00FF
};

// convert an cp1252 character into an unicode character
owl_wchar owl_wchar_cp1252_as_unicode(owl_wchar cp1252)
{
  if (owl_check_wchar_cp1252(cp1252) == 0)
    return OWL_INV_CP1252;
  return owl_cp1252_unicode_map[cp1252];
}

// convert an unicode character into a cp1252 character
owl_wchar owl_wchar_unicode_as_cp1252(owl_wchar unicode)
{
  // manually search for the unicode integer on the table above
  owl_mem_space mem_sp = {
    .ptr = (void *) owl_cp1252_unicode_map,
    .size = (OWL_MAX_CP1252 + 1) * sizeof(owl_wchar)
  };
  owl_arr arr = {
    .arr = &mem_sp,
    .var.type = OWL_TYPE_WCHAR,
    .var.size = sizeof(owl_wchar),
    .var.print_elem = owl_print_wchar,
    .var.comp_elem = owl_comp_wchar
  };
  owl_wchar ch = OWL_INV_CP1252;
  owl_byte * ptr = NULL;
  if ((ptr = owl_find_arr_elem(&arr, (void *) &unicode, sizeof(owl_wchar))) != NULL)
    ch = (ptr - arr.arr -> ptr) / arr.var.size;
  return ch;
}
